/*
 * @Author: ljk
 * @Date: 2023-05-15 21:29:15
 * @LastEditors: ljk
 * @LastEditTime: 2023-05-17 19:09:38
 * @Description: 进程信号模拟实现
 */
#include <iostream>
#include <signal.h>
#include <unistd.h>
#include <errno.h>
#include <cstring>
#include <sys/types.h>
#include <unistd.h>
// #include <sstream>

int count = 0;

void Usage(std::string proc)
{
    std::cout << "\tUsage: \n\t";
    std::cout << proc << " 信号编号 目标进程\n"
              << std::endl;
}

void myhandler(int signo)
{
    std::cout << "get a signal: " << signo << " count: " << count << std::endl;
    int n = alarm(10);
    std::cout << "return: " << n << std::endl;

    //取消闹钟
    //alarm(0);
    //exit(0);
}

int main(int argc, char *argv[])
{
    std::cout << "pid: " << getpid() << std::endl;
    signal(SIGALRM, myhandler);
    alarm(10); //一次性的alarm

    while (true)
    {
        sleep(1);
    }


    // while (true) count++;

    //实验后 IO是非常浪费时间的!
    // {
    //     // 打印: 显示器打印: IO 网络数据传输: IO
    //     //std::cout << "count: " << count++ << std::endl; // 15.我们的计算机会将一个整数累计到多少 -- 算力
    // }

    // signal(SIGABRT, myhandler);

    // while (true)
    // {
    //     std::cout << "begin" << std::endl;
    //     sleep(1);
    //     abort(); // 给自己发送指定的信号:不传参数默认信号2
    //     std::cout << "end" << std::endl;
    // }

    // signal(SIGINT, myhandler);

    // while (true)
    // {
    //     sleep(1);
    //     raise(SIGINT);
    // }

    // if (argc != 3)
    // {
    //     Usage(argv[0]);
    //     exit(1);
    // }
    // // std::stringstream ss;
    // int signo = atoi(argv[1]); //?
    // int target_id = atoi(argv[2]); //?
    // int n = kill(target_id, signo);
    // if(n != 0)
    // {
    //     std::cerr << errno << " : " << strerror(errno) << std::endl;
    //     exit(2);
    // }

    // return 0;
}

// signo: 特定信号被发送给当前进程的时候, 执行handler方法的时候, 要自定填充对应的信号给handler方法
// 我们甚至可以给所有的信号设置同一个处理函数
// void handler(int signo)
// {
//     std::cout << "get a signal: " << signo << std::endl;
//     // exit(2);
// }

// typedef void (*fun_t)();

// void print()
// {
//     printf("hello world\n");
// }
// void show(int a, fun_t f)
// {
//     printf("show\n");
// }

// int main()
// {
//     // 1. 2号信号进程的默认处理是终止进程
//     // 2. signal 可以进程对指定的信号设定自定义处理动作
//     // 3. signal(2, handler)调用完这个函数的时候,hander方法被调用了嘛? 没有:做了什么 只是更改了二号信号的处理动作,并没有调用handler方法
//     // 4. 那么handler方法什么时候被调用 : 收到对应的信号的时候
//     // 5. 默认我们对2号信号的处理动作是处理进程
//     // show(10, print);

//     // signal(SIGINT, handler);
//     // signal(SIGQUIT, handler);

//     // 9号信号不可被重写 -- 管理员信号
//     //  for (int i = 1; i <= 31; i++)
//     //  {
//     //      signal(i, handler);
//     //  }

//     while (true)
//     {
//         std::cout << "我是一个进程, 我正在运行..."
//                   << "我的pid: " << getpid() << std::endl;
//         sleep(1);
//     }
//     return 0;
// }